package com.atguigu.juc.date930;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * @Author: shenhao
 * @CreatTime: 2024/10/1 10:52
 * @Version: 1.0
 * 阻塞队列
 * 好处是我们不需要关心什么时候需要阻塞线程，什么时候需要唤醒线程，
 * 因为这一切BlockingQueue都给你一手包办了
 */
public class BlockingQueueDemo {
    public static void main(String[] args) throws InterruptedException {
        BlockingQueue<String> queue = new ArrayBlockingQueue<String>(3);
        // 第一组, 会报异常, 方法 插入 add, remove element 检查
//        System.out.println(queue.add("a"));
//        System.out.println(queue.add("b"));
//        System.out.println(queue.add("c"));
//        System.out.println(queue.element());//检索但不删除此队列的头部。此方法的不同之处在于 peek ，如果此队列为空，则会引发异常。
//       // System.out.println(queue.add("d"));
//        System.out.println(queue.remove()); // 返回并删除的是队列的头部
//        System.out.println(queue.remove());
//        System.out.println(queue.remove());
        //System.out.println(queue.remove());
        // 第二组 插入成功返回true, 失败返回 false, 移除方法 成功返回出队列的元素,失败返回null
        // 三个方法, offer(e)  poll()移除队列并返回第一个, peek() 检查队列第一个
//        System.out.println(queue.offer("a"));
//        System.out.println(queue.offer("b"));
//        System.out.println(queue.offer("c"));
//        System.out.println(queue.offer("d"));
//        System.out.println(queue.peek());//检索但不删除此队列的头部，如果此队列为空，则返回 null 。
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
//        System.out.println(queue.poll());
        // 第三组, 一直阻塞: 当队列满的状态下 继续put元素,队列会一直阻塞生产者线程直到put数据or响应中断退出
        //当阻塞队列空时，消费者线程试图从队列里take元素，队列会一直阻塞消费者线程直到队列可用
        // 方法 put(e) take()  没有检查方法
//        queue.put("a");// void
//        queue.put("b");// void
//        queue.put("c");// void
//       // queue.put("d");// void  队列满了就会堵塞
//        System.out.println(queue.take());
//        System.out.println(queue.take());
//        System.out.println(queue.take());
        //System.out.println(queue.take());// 队列空了继续取数据,会堵塞
        //第四组 超时退出 当阻塞队列满时，队列会阻塞生产者线程一定时间，超过限时后生产者线程会退出
        //方法 offer(e,time,unit) poll(time,unit)
        System.out.println(queue.offer("a", 3l, TimeUnit.SECONDS));
        System.out.println(queue.offer("b", 3l, TimeUnit.SECONDS));
        System.out.println(queue.offer("c", 3l, TimeUnit.SECONDS));
        System.out.println(queue.offer("d", 3l, TimeUnit.SECONDS));
        System.out.println(queue.poll(3l, TimeUnit.SECONDS));
        System.out.println(queue.poll(3l, TimeUnit.SECONDS));
        System.out.println(queue.poll(3l, TimeUnit.SECONDS));
        System.out.println(queue.poll(3l, TimeUnit.SECONDS));// 超过时间会是null

    }
}
